package com.yourenbang.lingyun.transaction.mapper;

import com.yourenbang.lingyun.transaction.web.domain.po.Merchant;
import com.yourenbang.lingyun.transaction.web.domain.vo.QualityMerchantVO;
import com.yourenbang.transaction.api.model.dto.manage.ExportPledgeListDTO;
import com.yourenbang.transaction.api.model.dto.manage.QueryClientPledgeListDTO;
import com.yourenbang.transaction.api.model.dto.manage.QueryPledgeListDTO;
import com.yourenbang.transaction.api.model.vo.manage.*;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

public interface TransactionMerchantMapper {

    int updateByPrimaryKeySelective(Merchant record);

    Merchant selectByMerchantNo(@Param("merchantNo") String merchantNo, @Param("platNo") Short platNo);

    Merchant selectByUserBaseId(@Param("userBaseId") String userBaseId, @Param("platNo") Short platNo);

    List<QueryPledgeListVO> selectPledgeList(QueryPledgeListDTO dto);

    List<QueryPledgeListVO> exportPledgeList(ExportPledgeListDTO dto);

    QueryPledgeDetailVO selectPledgeDetail(@Param("merchantId") String merchantId);

    /**
     * 更新 机具激活时间 TerminalActiveTime 为 null
     */
    int setTerminalActiveTimeNull(@Param("merchantId") Integer merchantId, @Param("platNo") Short platNo);

    String queryUserBaseIdByMerchantNo(@Param("platNo") Short platNo, @Param("merchantNo") String merchantNo);

    List<QualityMerchantVO> selectQualityMerchantList(@Param("time") LocalDateTime time);

    /**
     * 查询终端（基梯）押金对账列表
     * @param dto 查询条件
     * @return 押金列表
     */
    List<QueryClientPledgeListVO> queryClientPledgeList(QueryClientPledgeListDTO dto);

    /**
     * 押金对账 统计 (金额和笔数)
     * @param dto 查询条件
     * @return 统计结果
     */
    QueryClientPledgeStatisticsVO queryClientPledgeStatistics(QueryClientPledgeListDTO dto);

    /**
     * 查询下游押金金额总和
     * @param clientNo
     * @param beginTime
     * @param endTime
     * @param agentIds 机构ID主要用来区分是新机构还是旧机构
     * @return
     */
    BigDecimal queryClientPledgeAmount(@Param("clientNo") String clientNo,@Param("beginTime")String beginTime,
                                       @Param("endTime") String endTime, @Param("agentIds") List<String> agentIds);

    /**
     * 更新下游押金状态为已经领取
     * @param clientNo
     * @param beginTime
     * @param endTime
     * @return
     */
    int updateClientPledgeStatus(@Param("clientNo") String clientNo,@Param("beginTime")String beginTime,
                                 @Param("endTime")String endTime);

    /**
     * 押金对账 统计 (渠道和数量)
     * @param dto 查询条件
     * @return 统计结果
     */
    List<QueryClientPledgeStatisticsChannelVO> queryClientPledgeChannelStatistics(QueryClientPledgeListDTO dto);

    /**
     * 通过机具号获取绑定商户的商户号
     * @param terminalSn 机具号
     * @return 商户号
     */
    String getMerchantNoByTerminalSn(@Param("platNo") Short platNo, @Param("terminalSn") String terminalSn);

    /**
     * 获取商户费率策略的优惠时间
     * @param merchantNo 商户号
     * @param channelId 渠道ID
     * @return 如果有费率策略则 返回时间，没有费率策略返回null
     */
    Integer getMerchantDiscountDay(@Param("merchantNo") String merchantNo, @Param("channelId") Short channelId);
}